package proxy_pattern.dynamic.ex1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Calendar;

/**
 * @author 申书航
 * @version 1.0
 * 该类实现了动态代理中的InvocationHandler接口，用于增强方法调用的日志功能
 */
public class LogHandler implements InvocationHandler {

    private final Object proxyObj;

    /**
     * 构造函数，接收一个被代理的对象
     * @param proxyObj 被代理的对象
     */
    public LogHandler(Object proxyObj) {
        this.proxyObj = proxyObj;
    }

    /**
     * 生成日志前缀字符串，包含当前时间和被代理对象的类名
     * @return 时间和类名组成的字符串
     */
    private String getLogPrefixStr() {
        int h = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
        int m = Calendar.getInstance().get(Calendar.MINUTE);
        int s = Calendar.getInstance().get(Calendar.SECOND);
        return "[" + h + ":" + m + ":" + s + "] " + proxyObj.getClass().getSimpleName() + " ";
    }

    /**
     * 在方法调用前输出日志信息
     * @param id 用户的ID
     */
    private void beforeInvoke(Object id) {
        System.out.println(getLogPrefixStr() + "你正在为id为" + id + "的用户执行数据操作");
    }

    /**
     * 在方法调用后输出日志信息
     * @param id 用户的ID
     * @param res 方法的返回结果
     */
    private void afterInvoke(Object id, Object res) {
        System.out.println(getLogPrefixStr() + "id为" + id + "的数据操作结果为" + res);
    }

    /**
     * 重写invoke方法，调用被代理对象的方法，并在调用前后输出日志
     * @param proxy 当前代理对象
     * @param method 被调用的方法
     * @param args 方法的参数
     * @return 方法的返回结果
     * @throws Throwable 可能抛出的异常
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        beforeInvoke(args[0]);
        Object res = method.invoke(proxyObj, args);
        afterInvoke(args[0], res);
        return res;
    }
}

